package com.zpc.myvideoserver;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
import com.baomidou.mybatisplus.generator.query.SQLQuery;

import java.util.Collections;
import java.util.Scanner;

/**
 * @ClassName : Generator  //类名
 * @Description : 代码生成器  //描述
 * @Author : zpc20 //作者
 * @Date: 2023/11/1  23:58
 */
public class Generator {
    /**
     * @Name: scanner
     * @Params : [tips]:[java.lang.String]获取提示信息
     * @Description : 获取用户控制台输入字符
     * @Author : zpc20
     * @Date : 2023/11/3 18:20
     * @Return java.lang.String
     * @Throws
     */
    public  static  String scanner(String tips){
        // @Description : 获取输入实例 zpc20 2023/11/3 18:24
        Scanner scanner = new Scanner(System.in);
        // @Description : 提示信息建构实例 zpc20 2023/11/3 18:28
        StringBuilder help = new StringBuilder();
        help.append("请输入:").append(tips).append(":");
        // @Description : 输出提示信息 zpc20 2023/11/3 18:30
        System.out.println(help.toString());
        if(scanner.hasNext()){
            String ipt = scanner.next();
            if(StringUtils.isNotBlank(ipt)){
                return ipt;
            }
        }
        // @Description : 出错抛出异常 zpc20 2023/11/3 18:32
        throw  new MybatisPlusException("请输入正确的"+tips+"!");
    }

    // @Description : 代码生成器主类 zpc20 2023/11/3 18:33
    public static void main(String[] args) {
        // @Description: 数据源配置 zpc20 2023/11/3 18:34
        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/myvideo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false","root","131456")
                .typeConvert(new MySqlTypeConvert()) //类型转换器
                .keyWordsHandler(new MySqlKeyWordsHandler())// 关键字处理
                .databaseQueryClass(SQLQuery.class)
                .build();
        // @Description : 获取工作目录 zpc20 2023/11/3 18:54
        String path = System.getProperty("user.dir");
        // @Description : 全局配置 zpc20 2023/11/3 18:51
        GlobalConfig globalConfig = new GlobalConfig.Builder()
                .outputDir(path+"/src/main/java")//指定输出目录
                .enableSwagger()//开启swagger
                .author("zpc")//作者名称
                .dateType(DateType.TIME_PACK)//时间类型
                .commentDate("yyyy/MM/dd")//注释日期格式
                .build();
        // @Description : 包配置 zpc20 2023/11/3 18:57
        PackageConfig packageConfig = new PackageConfig.Builder()
                .parent("com.zpc.myvideoserver")//父包名
                .build();
        // @Description : 模版配置 zpc20 2023/11/3 19:04
        TemplateConfig templateConfig = new TemplateConfig.Builder()
                .disable(TemplateType.XML)//禁用xml不需要配置xml
                .entity("/templates/entity.java")
                .service("/templates/service.java")
                .serviceImpl("/templates/serviceImpl.java")
                .mapper("/templates/mapper.java")
                .controller("/templates/controller.java")
                .build();
        // @Description : 策略配置 zpc20 2023/11/3 19:46
        StrategyConfig strategyConfig = new StrategyConfig.Builder()
                .addInclude(scanner("表名,多个表名用,隔开"))//导入表名
                .entityBuilder()//实体类配置
                .enableLombok() //使用lombok
                .enableChainModel()
                .disableSerialVersionUID()
                .idType(IdType.AUTO)
                .enableTableFieldAnnotation()
                .naming(NamingStrategy.underline_to_camel)//驼峰命名
                .columnNaming(NamingStrategy.underline_to_camel)
                .formatFileName("%s")//文件名
                .controllerBuilder()//控制类配置
                .enableHyphenStyle()
                .enableRestStyle()
                .formatFileName("%sController")
                .serviceBuilder()//服务类配置
                .formatServiceFileName("%sService")
                .formatServiceImplFileName("%sServiceImpl")
                .mapperBuilder()//mapper映射类配置
                .formatMapperFileName("%sMapper")
                .build();


        // @Description : 模版配置启动 zpc20 2023/11/3 19:50
        AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfig);
        autoGenerator.global(globalConfig);
        autoGenerator.packageInfo(packageConfig);
        autoGenerator.strategy(strategyConfig);
        autoGenerator.template(templateConfig);
        autoGenerator.execute();

    }




}
